/**
 * ES6 Promise.then 的应用举例
 * 需求：读取第一个文件 a.txt，然后拿到读取的内容作为路径读取第二个文件 b.txt
 * 实现方案一：嵌套 fs.readFile 缺点：代码嵌套多层回调显得不美观，而且异步错误处理不能统一
 * 实现方案二：使用 promise.then 实现嵌套
 * then() 原理
 * 1) 如果一个 promise 的 then 方法中的参数(成功/失败)返回一个 Promise 实例 的话，会自动将这个 promise 执行，并且采用它的状态，成功的结果会传递给外层的下一个 then，每次执行 Promise 的 then 方法都会返回一个新的 Promise 实例
 * 2) 如果当前 promise 的 then 返回的是一个普通值，这个普通值就会作为下一个 then 的结果，所以会出现值穿透的情况 别如 Promise.resolve(1).then(2).then(3).then(res => console.log(res)),打印的结果是 1
 * 3) 如果 then 第一个参数是一个值，会被封装成一个函数 (x) => x
 * 4) 只有两种情况会抛错：返回一个失败的 Promise、或者抛异常
 */
const fs = require('fs')

// 定义一个读文件的函数，传入一个 path 参数，返回一个新的 Promise 实例
function read(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, 'utf8', (err, data) => {
      if (err) reject(err)
      console.log('文件内容为：' + data)
      resolve(data)
    })
  })
}

// 调用 read 函数
read('./file/a.txt').then(res => {
  // 读取第一个文件内容作为 path 继续调用 read 函数
  return read(res + '1')
}, err => {
  console.log('读取第一个文件报错：', err)
}).then(res => {
  console.log('最终读取到的结果：' + res)
}, err => {
  console.log('读取第二个文件报错：', err)
}).then(res => {
  // 如果想在这个 then 里面终止 promise，需要返回一个新的 pending 状态的 Promise 实例
  return new Promise()
}).then(res => {
  // 如果上方的 then 不返回 pending 的实例，最后都会返回 fulfilled/rejected 的 promise 实例
  // 这样就可以继续 then 调用，bu
}, err => { })
